package ar.com.test.actualizadores;

import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;

import java.util.List;
import java.util.Vector;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import ar.com.logic.components.Numero;
import ar.com.logic.components.actualizadores.ActualizadorPorDescarteSinUso;
import ar.com.logic.components.actualizadores.ActualizadorRespuestaPosicionUnica;
import ar.com.logic.components.interfaces.IHistoricoRespuestas;
import ar.com.logic.components.interfaces.IMatrizPosiciones;
import ar.com.test.logic.componentes.dummy.RespuestaDummy;

public class ActualizadorRespuestaPosicionUnicaUT {

	private IHistoricoRespuestas historicoMock;
	private IMatrizPosiciones matrizMock;
	private ActualizadorRespuestaPosicionUnica act;

	@Before
	public void setup() {
		historicoMock = createMock(IHistoricoRespuestas.class);
		matrizMock = createMock(IMatrizPosiciones.class);
		act = new ActualizadorRespuestaPosicionUnica();
	}

	@Test
	public void testRespuestaConTodosBienNoActualiza() {
		/*
		 * La respuesta muestra todos Bien, no se puede actualizar nada
		 */

		expect(historicoMock.obtenerUltimaRespuesta()).andReturn(
				new RespuestaDummy(2, 0, new Numero("1234")));
		replay(historicoMock);
		Assert.assertEquals(false, act.actualizar(matrizMock, historicoMock));
		verify(historicoMock);

	}

	@Test
	public void testRespuestaConSoloRegularesSeActualiza() {
		/*
		 * La respuesta tiene al menos 1 regular, por lo que debe actualizar 
		 * las respectivas posiciones usando descartarPosicion
		 */

		expect(historicoMock.obtenerUltimaRespuesta()).andReturn(
				new RespuestaDummy(0, 1, new Numero("1234")));
		matrizMock.descartarPosicionParaValor(1, 1);
		matrizMock.descartarPosicionParaValor(2, 2);
		matrizMock.descartarPosicionParaValor(3, 3);
		matrizMock.descartarPosicionParaValor(4, 4);
		replay(historicoMock);
		replay(matrizMock);
		Assert.assertEquals(true, act.actualizar(matrizMock, historicoMock));
		verify(historicoMock);
		verify(matrizMock);

	}
	
	@Test
	public void testRespuestaConBienYRegularesNoActualiza() {
		/*
		 * La respuesta tiene al menos 1 bien, por lo que no debe actualizar 

		 */

		expect(historicoMock.obtenerUltimaRespuesta()).andReturn(
				new RespuestaDummy(1, 1, new Numero("1234")));

		replay(historicoMock);
		
		Assert.assertEquals(false, act.actualizar(matrizMock, historicoMock));
		verify(historicoMock);
		

	}
	@Test
	public void testRespuestaConTodosMalSeActualiza() {
		/*
		 * La respuesta no tiene ninguno correcto o regular. 
		 * se deben descartar los numeros en cuestion
		 */


		expect(historicoMock.obtenerUltimaRespuesta()).andReturn(
				new RespuestaDummy(0, 0, new Numero("1234")));
		matrizMock.descartarValor(1);
		matrizMock.descartarValor(2);
		matrizMock.descartarValor(3);
		matrizMock.descartarValor(4);
		replay(historicoMock);
		replay(matrizMock);
		
		Assert.assertEquals(true, act.actualizar(matrizMock, historicoMock));
		verify(historicoMock);
		verify(matrizMock);

	}
	
}
